﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;
using ReactiveUI.Fody.Helpers;

namespace Common.ViewModels.调度
{

    /*这里使用主通道占用的办法,那么小车的调度受到极大的抑制  将会导致小车行进缓慢不符合需求 故而只能采用的办法*/

    /*这里采用方法二 站点导航躲避法 ,但是三个小车  同时时会导致前后都堵住的可能  这里还需要
     */

    /// <summary>
    /// 这里使用单例模式
    /// </summary>
    public class 主通道调度:BaseViewModel, ISchedule
    {
        

        public void Start()
        {

        }

        private static readonly object lock主通道状态=new ();

        /// <summary>
        /// 主通道的小车的数量
        /// </summary>
        [JsonIgnore]
        [Reactive]
        public int 主通道小车数量 { get; set; }


        /// <summary>
        /// 三个小车无法泊车
        /// </summary>
        [Reactive] public int 主通道最大小车数量 { get; set; } = 2;


        [JsonIgnore]
        public 主通道状态 主通道状态 { get; set; }

        /// <summary>
        /// 当前占用车辆
        /// </summary>
        [JsonIgnore]
        [Reactive]
        public Car 占用车辆 { get; set; }

        /// <summary>
        /// 最后的小车行进轨迹
        /// </summary>
        [JsonIgnore]
        [Reactive]
        public 主通道轨迹 主通道轨迹 { get; set; }

        [Reactive] public double 轨迹容错 { get; set; } = 100;

        /// <summary>
        /// 上主通道之前需要确定主通道有没有被占用(多个模块同时调用)
        /// </summary>
        /// <returns></returns>
        public bool 获取并占用主通道(Car car)
        {
            if (主通道状态 == 主通道状态.占用)
            {
                return false;
            }

            lock (lock主通道状态)
            {
                if (主通道状态 == 主通道状态.占用)
                {
                    return false;
                }

                主通道状态 = 主通道状态.占用;
                this.占用车辆 = car;
            }
            return true;
        }

        /// <summary>
        /// 上主通道之前需要确定主通道有没有被占用(多个模块同时调用)
        /// </summary>
        /// <returns></returns>
        public bool 获取能否进入主通道()
        {
            if (this.主通道小车数量 >= 2)
            {
                return false;
            }

            lock (lock主通道状态)
            {
                if (this.主通道小车数量 >= 2)
                {
                    return false;
                }
                else
                {
                    this.主通道小车数量 = this.主通道小车数量 + 1;
                    return true;
                }
            }
        }

        /// <summary>
        /// 释放主通道小车
        /// </summary>
        public void Realse()
        {
            lock (lock主通道状态)
            {
                this.主通道小车数量 = this.主通道小车数量 - 1;
            }
        }

        /// <summary>
        /// 上主通道之前需要确定主通道有没有被占用(多个模块同时调用)
        /// </summary>
        /// <param name="主通道轨迹"></param>
        /// <returns></returns>
        public bool 获取能否进入主通道(主通道轨迹 主通道轨迹)
        {
            if (this.主通道小车数量 >= 2)
            {
                return false;
            }

            lock (lock主通道状态)
            {
                if (this.主通道小车数量 >= 2)
                {
                    return false;
                }

                if (this.主通道小车数量 == 0)
                {
                    this.主通道小车数量 = this.主通道小车数量 + 1;
                    return true;
                }

                if (this.主通道小车数量 == 1)
                {
                    //需要进行轨迹判断,判断轨迹是否冲突,当不出现轨迹冲突时即可进入主通道
                    this.主通道小车数量 = this.主通道小车数量 + 1;
                    return true;
                }

                return false;
            }
        }

        /// <summary>
        /// 这里主导轨不再进进出出,主轨道进出会互相干涉。
        /// </summary>
        /// <param name="进入主通道的小车的轨迹"></param>
        /// <returns></returns>
        public bool 是否轨道冲突(主通道轨迹 进入主通道的小车的轨迹)
        {
            return false;
        }

        //public void Enter

        


    }

    public class 主通道轨迹
    {
        public Station StartStation { get; set; }

        public Station EndStation { get; set; }

        /// <summary>
        /// 小车(当前位置)
        /// </summary>
        public Car Car{ get; set; }
    }

    public enum 主通道状态 
    {
        占用,
        空闲,
    }
}
